import { IFsmState } from "./IFsmState";

/**
 * 有限状态机接口
 * @type 有限状态机持有者类型
 */
export interface IFsm<OwnerT, DataT>{
    /**
     * 有限状态机名称
     */
    readonly name:string;
    /**
     * 有限状态机完整全名
     */
    readonly fullName:string;
    /**
     * 有限状态机持有者
     */
    readonly owner:OwnerT|null;
    /**
     * 有限状态机中所有状态数量
     */
    readonly fmsStateCount:number;

    /**
     * 有限状态机是否正在运行
     */
    readonly isRunning:boolean;

    /**
     * 有限状态机是否被销毁
     */
    readonly isDestroyed:boolean;

    /**
     * 获取有限状态机的当前状态
     */
    readonly currentState:IFsmState<OwnerT, DataT>|null;

    /**
     * 获取有限状态机当前状态持续的时间
     */
    readonly currentStateTime:number;

    /**
     * 获取数据
     */
    readonly data:DataT;

    /**
     * 开始有限状态机
     * @param stateName 状态名称
     */
    start(stateName:string):void;
    
    /**
     * 是否存在有限状态机状态
     * @param stateName 状态名称
     */
    hasState(stateName:string): boolean;
    
    /**
     * 获取有限状态机状态
     * @param stateName 状态名称
     */
    getState<T extends IFsmState<OwnerT, DataT>>(stateName:string):T|undefined;

    /**
     * 获取有限状态机的所有状态
     */
    getAllStates():IFsmState<OwnerT, DataT>[];

    /**
     * 切换当前有限状态机状态
     * @param stateClass 
     */
    changeState(stateName:string):void;
}